home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Almathera Ten Pack 3: CDPD 3
/
Almathera Ten on Ten - Disc 3: CDPD3.iso
/
scope
/
101-125
/
scopedisk106
/
plot1.3a
/
cf.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-03-19
|
6KB
|
254 lines
#include <stdio.h>
#include <fcntl.h>
#define ASTR 0;
#define DIGIT 1;
#define WSPC 2;
#define NEWLINE 3;
#define DASH 4;
#define MISC 5;
long ftell();
struct state_rec
{
short next;
short action;
};
struct state_rec s_table[8][6] =
{
/* state 0 */
{
{ 1, 0 }, /* ASTR */
{ 0, 0 }, /* DIGIT */
{ 0, 0 }, /* WSPC */
{ 0, 0 }, /* NEWLINE */
{ 0, 99}, /* DASH */
{ 0, 99 } /* MISC */
},
/* state 1 */
{
{ 0, 99 }, /* ASTR */
{ 2, 2 }, /* DIGIT */
{ 1, 0 }, /* WSPC */
{ 0, 99 }, /* NEWLINE */
{ 0, 99}, /* DASH */
{ 0, 99 } /* MISC */
},
/* state 2 */
{
{ 3, 4 }, /* ASTR */
{ 2, 3 }, /* DIGIT */
{ 3, 4 }, /* WSPC */
{ 4, 4 }, /* NEWLINE */
{ 0, 99}, /* DASH */
{ 3, 4 } /* MISC */
},
/* state 3 */
{
{ 3, 0 }, /* ASTR */
{ 3, 0 }, /* DIGIT */
{ 3, 0 }, /* WSPC */
{ 4, 0 }, /* NEWLINE */
{ 3, 0}, /* DASH */
{ 3, 0 } /* MISC */
},
/* state 4 */
{
{ 0, 99 }, /* ASTR */
{ 5, 2 }, /* DIGIT */
{ 4, 0 }, /* WSPC */
{ 4, 0 }, /* NEWLINE */
{ 5, 7}, /* DASH */
{ 0, 99 } /* MISC */
},
/* state 5 */
{
{ 0, 6 }, /* ASTR */
{ 5, 3 }, /* DIGIT */
{ 6, 5 }, /* WSPC */
{ 6, 5 }, /* NEWLINE */
{ 0, 99}, /* DASH */
{ 0, 99 } /* MISC */
},
/* state 6 */
{
{ 1, 1 }, /* ASTR */
{ 5, 2 }, /* DIGIT */
{ 6, 0 }, /* WSPC */
{ 6, 0 }, /* NEWLINE */
{ 5, 7}, /* DASH */
{ 0, 99 } /* MISC */
}
};
FILE *infile;
int outfile;
char inname[100];
char outname[100];
char linebuf[100];
unsigned long d_index[256];
short data[30000];
main(argc,argv)
int argc;
char *argv[];
{
short CellWidth,CellHeight;
short HighChar;
unsigned long pos;
short val;
char c;
short class, i;
short state,nextstate;
short action;
short sign;
state=0;
pos=0;
HighChar=0;
if(argc!=2)
{
printf("bad args\n");
exit();
}
strcpy(inname,argv[1]);
strcat(inname,".fnt");
strcpy(outname,"pltdata:");
strcat(outname,argv[1]);
infile=fopen(inname,"r");
if( infile == NULL )
{
printf("can't open %s\n",inname);
exit();
}
outfile=open(outname,O_CREAT | O_WRONLY);
if( outfile == -1 )
{
printf("can't open %s\n",outname);
exit();
}
printf("Creating %s.\n",outname);
for (i=0; i<256; i++)
d_index[i]=-1;
linebuf[0]=0;
fgets(linebuf,99,infile);
if( sscanf(linebuf,"%d %d",&CellWidth,&CellHeight) != 2 )
{
printf("error in width or height\n");
exit();
}
while( feof(infile) == 0 )
{
c=fgetc(infile);
if( c == EOF )
break;
switch(c)
{
case '*': class=ASTR;
break;
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9': class=DIGIT;
break;
case ' ':
case '\t': class=WSPC;
break;
case '\n': class=NEWLINE;
break;
case '-': class=DASH;
break;
default: class=MISC;
}
nextstate=s_table[state][class].next;
action=s_table[state][class].action;
#ifdef DEBUG
printf("cs %d c '%c' ns %d ac %d\n",state,c,nextstate,action);
#endif
switch(action)
{
case 1: data[pos]=-1;
pos++;
break;
case 2: val = c - '0';
sign=1;
break;
case 3: val = (val * 10) + (c - '0');
break;
case 4: d_index[val] = pos;
if(HighChar < val)
HighChar = val;
break;
case 5: data[pos] = sign*val;
pos++;
break;
case 6: data[pos] = sign*val;
pos++;
data[pos] = -1;
pos++;
break;
case 7: sign=-1;
val=0;
break;
case 99: printf("\nerror: c='%c' pos=%ld\n",c,(long)ftell(infile));
exit();
break;
}
state=nextstate;
}
data[pos++]=-1;
write(outfile,&HighChar,sizeof(short));
write(outfile,&CellWidth,sizeof(short));
write(outfile,&CellHeight,sizeof(short));
write(outfile,d_index,(int)((HighChar+1)*sizeof(long)));
write(outfile,&pos,sizeof(long));
write(outfile,data,(int)(pos*sizeof(short)));
fclose(infile);
close(outfile);
}